package com.main;

import java.util.HashMap;
import java.util.Map;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * 版权：上海极和信息科技有限公司
 * 功能：
 * 作者：朱伟峰
 * 邮箱：zhuweifeng24@gmail.com
 * 日期：2017年5月31日
 */
public class MpGenerator
{
	public static void main(String[] args)
	{
		AutoGenerator mpg = new AutoGenerator();

		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		gc.setOutputDir("F:\\jh_product\\admin-message\\src\\main\\java\\");
		gc.setFileOverride(true);
		gc.setActiveRecord(true);
		gc.setEnableCache(false); // XML 二级缓存
		gc.setBaseResultMap(true); // XML ResultMap
		gc.setBaseColumnList(false);// XML columList
		gc.setAuthor("上海极和信息科技有限公司");

		// 自定义文件命名，注意 %s 会自动填充表实体属性！
		// gc.setMapperName("%sDao");
		// gc.setXmlName("%sDao");
		// gc.setServiceName("MP%sService");
		// gc.setServiceImplName("%sServiceDiy");
		// gc.setControllerName("%sAction");
		mpg.setGlobalConfig(gc);

		// 数据源配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setDbType(DbType.MYSQL);
		dsc.setTypeConvert(new MySqlTypeConvert()
		{
			// 自定义数据库表字段类型转换【可选】
			@Override
			public DbColumnType processTypeConvert(String fieldType)
			{
				System.out.println("转换类型：" + fieldType);
				return super.processTypeConvert(fieldType);
			}
		});
		dsc.setDriverName("com.mysql.jdbc.Driver");
		dsc.setUsername("zhuweifeng");
		dsc.setPassword("850311");
		dsc.setUrl("jdbc:mysql://www.jiheit.com:3306/jh_message?characterEncoding=utf8");
		mpg.setDataSource(dsc);

		// 策略配置
		StrategyConfig strategy = new StrategyConfig();
		// strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
		strategy.setTablePrefix(new String[]
		{ "conf", "logs", "temp" }); // 此处可以修改为您的表前缀
		strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
		
		// 需要生成的表
		strategy.setInclude(new String[] { "temp_mail", "temp_notice", "temp_sms", "temp_system", "temp_wx", "temp_wx_content" });
		// { "adm_function", "adm_function_group", "adm_role", "adm_role_right", "adm_admin", "adm_admin_role", "bas_user", "adm_menu" }); 
		
//		strategy.setExclude(new String[] { "公用数据-复制修改" }); // 排除生成的表
		// 自定义实体父类
		// strategy.setSuperEntityClass("com.lucky.entity");
		// 自定义实体，公共字段
		// strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
		// 自定义 mapper 父类
		// strategy.setSuperMapperClass("com.lucky.mapper");
		// 自定义 service 父类
		// strategy.setSuperServiceClass("com.lucky.service");
		// 自定义 service 实现类父类
		// strategy.setSuperServiceImplClass("com.lucky.service.impl");
		// 自定义 controller 父类
		// strategy.setSuperControllerClass("com.lucky.controller");
		// 【实体】是否生成字段常量（默认 false）
		// public static final String ID = "test_id";
		// strategy.setEntityColumnConstant(true);
		// 【实体】是否为构建者模型（默认 false）
		// public User setName(String name) {this.name = name; return this;}
		// strategy.setEntityBuliderModel(true);
		mpg.setStrategy(strategy);

		// 包配置
		PackageConfig pc = new PackageConfig();
		pc.setParent("com.b2b.message.admin");
		// pc.setModuleName("test");
		pc.setController("controller.auth");
		pc.setEntity("plus.entity");
		pc.setMapper("plus.mapper");
		pc.setService("plus.service");
		pc.setServiceImpl("plus.service.impl");
		pc.setXml("plus.mapper.xml");
		mpg.setPackageInfo(pc);

		// 注入自定义配置，可以在 VM 中使用 cfg.abc 【可无】
		InjectionConfig cfg = new InjectionConfig()
		{
			@Override
			public void initMap()
			{
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
				this.setMap(map);
			}
		};

		// // 自定义 xxList.jsp 生成
		// List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
		// focList.add(new FileOutConfig("/template/list.jsp.vm")
		// {
		// @Override
		// public String outputFile(TableInfo tableInfo)
		// {
		// // 自定义输入文件名称
		// return "D://my_" + tableInfo.getEntityName() + ".jsp";
		// }
		// });
		// cfg.setFileOutConfigList(focList);
		mpg.setCfg(cfg);

		// 调整 xml 生成目录演示
		// focList.add(new FileOutConfig("/templates/mapper.xml.vm")
		// {
		// @Override
		// public String outputFile(TableInfo tableInfo)
		// {
		// return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
		// }
		// });
		// cfg.setFileOutConfigList(focList);
		mpg.setCfg(cfg);

		// 关闭默认 xml 生成，调整生成 至 根目录
//		TemplateConfig tc = new TemplateConfig();
//		tc.setXml(null);
//		tc.setController(null);
//		tc.setMapper(null);
//		tc.setService(null);
//		tc.setServiceImpl(null);
//		tc.setEntity("...");
//		mpg.setTemplate(tc);

		// 自定义模板配置，可以 copy 源码 mybatis-plus/src/main/resources/template 下面内容修改，
		// 放置自己项目的 src/main/resources/template 目录下, 默认名称一下可以不配置，也可以自定义模板名称
		TemplateConfig tc = new TemplateConfig();
		// tc.setController("...");
//		 tc.setEntity("entity.java.vm");
		// tc.setMapper("...");
		// tc.setXml("...");
		// tc.setService("...");
		// tc.setServiceImpl("...");
		// 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
		mpg.setTemplate(tc);

		// 执行生成
		mpg.execute();

		// 打印注入设置【可无】
		System.err.println("success");
	}

}